#include "BarraMenu.h"
#include "VentanaDiseniador.h"
#include <gtkmm/stock.h>
#include <gtkmm/messagedialog.h>
#include <cstdlib>

BarraMenu::BarraMenu() : Gtk::Box(Gtk::ORIENTATION_VERTICAL, 5) {
	/* ACCIONES DEL MENU */
	ref_ActionGroup = Gtk::ActionGroup::create();

	/* nivel MENU */
	ref_ActionGroup->add(Gtk::Action::create("m_archivo", "Archivo"));
	ref_ActionGroup->add(Gtk::Action::create("m_ayuda", "Ayuda"));

	/* nivel MENU -> ARCHIVO */
	ref_ActionGroup->add(Gtk::Action::create("m_archivoNuevo", "Nuevo"));

	ref_ActionGroup->add(Gtk::Action::create("m_archivoAbrirMundo",
			Gtk::Stock::OPEN, "Abrir Mundo", "Abrir Mundo"),
			sigc::mem_fun(*this, &BarraMenu::on_menu_archivo_abrirMundo));

	ref_ActionGroup->add(Gtk::Action::create("m_archivoGuardarMundo",
			Gtk::Stock::SAVE, "Guardar Mundo", "Guardar Mundo"),
			sigc::mem_fun(*this, &BarraMenu::on_menu_archivo_guardarMundo));

	ref_ActionGroup->add(Gtk::Action::create("m_archivoEliminarNivel",
			Gtk::Stock::DELETE, "Eliminar Nivel", "Eliminar Nivel"),
			sigc::mem_fun(*this, &BarraMenu::on_menu_archivo_eliminarNivel));

	ref_ActionGroup->add(Gtk::Action::create("m_archivoSalir", "Salir"),
			sigc::mem_fun(*this, &BarraMenu::on_menu_archivo_salir));

	/* nivel MENU -> ARCHIVO -> NUEVO */
	ref_ActionGroup->add(Gtk::Action::create("m_archivoNuevoMundo", "Mundo"),
			sigc::mem_fun(*this, &BarraMenu::on_menu_archivo_nuevoMundo));

	ref_ActionGroup->add(Gtk::Action::create("m_archivoNuevoNivel",
			Gtk::Stock::NEW, "Nivel", "Nuevo Nivel"),
			sigc::mem_fun(*this, &BarraMenu::on_menu_archivo_nuevoNivel));

	/* nivel MENU -> AYUDA */
	ref_ActionGroup->add(Gtk::Action::create("m_ayudaAcerca",
			"Acerca de Diseñador"),
			sigc::mem_fun(*this, &BarraMenu::on_menu_ayuda_acerca));

	ref_UIManager = Gtk::UIManager::create();
	ref_UIManager->insert_action_group(ref_ActionGroup);

	Glib::ustring ui_info = "<ui>"
			"  <menubar name='BarraMenu'>"
			"    <menu action='m_archivo'>"
			"      <menu action='m_archivoNuevo'>"
			"        <menuitem action='m_archivoNuevoMundo'/>"
			"        <menuitem action='m_archivoNuevoNivel'/>"
			"      </menu>"
			"      <menuitem action='m_archivoAbrirMundo'/>"
			"      <menuitem action='m_archivoGuardarMundo'/>"
			"      <menuitem action='m_archivoEliminarNivel'/>"
			"      <separator/>"
			"      <menuitem action='m_archivoSalir'/>"
			"    </menu>"
			"    <menu action='m_ayuda'>"
			"      <menuitem action='m_ayudaAcerca'/>"
			"    </menu>"
			"  </menubar>"
			"  <toolbar  name='BarraHerramientas'>"
			"    <toolitem action='m_archivoNuevoNivel'/>"
			"    <toolitem action='m_archivoAbrirMundo'/>"
			"    <toolitem action='m_archivoGuardarMundo'/>"
			"    <toolitem action='m_archivoEliminarNivel'/>"
			"  </toolbar>"
			"</ui>";

	try {
		ref_UIManager->add_ui_from_string(ui_info);
	}
	catch (const Glib::Error& ex) {
		exit(1);
	}

	Gtk::Widget* ptrBarraMenu = ref_UIManager->get_widget("/BarraMenu");
	if (ptrBarraMenu != NULL) {
		pack_start(*ptrBarraMenu, Gtk::PACK_SHRINK);
	}

	Gtk::Widget* ptrBarraHerramientas =
			ref_UIManager->get_widget("/BarraHerramientas");

	if (ptrBarraHerramientas != NULL) {
		pack_start(*ptrBarraHerramientas, Gtk::PACK_SHRINK);
	}
}

const Glib::RefPtr<Gtk::UIManager> BarraMenu::getUIManager() const {
	return ref_UIManager;
}

BarraMenu::~BarraMenu() { }

void BarraMenu::on_menu_archivo_nuevoMundo() {
	VentanaDiseniador *ventana = dynamic_cast<VentanaDiseniador*>(
			get_toplevel());
	ventana->resetear();
}

void BarraMenu::on_menu_archivo_nuevoNivel() {
	VentanaDiseniador *ventana = dynamic_cast<VentanaDiseniador*>(
			get_toplevel());
	PropiedadesMundo *mundo = ventana->getPropiedadesMundoActual();
	mundo->crearNuevoPropiedadesNivel();
	ventana->getVistaNavegador()->agregarNivel(
			mundo->getPropiedadesNivelActual()->getId());
	ventana->actualizarVistaPropiedadesNivel();

}

void BarraMenu::on_menu_archivo_abrirMundo() {
	VentanaDiseniador *ventana = dynamic_cast<VentanaDiseniador*>(
			get_toplevel());
	Gtk::FileChooserDialog navegador_archivos("Escoge un XML para cargar",
			Gtk::FILE_CHOOSER_ACTION_OPEN);
	navegador_archivos.set_transient_for(*ventana);

	navegador_archivos.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
	navegador_archivos.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK);

	Glib::RefPtr<Gtk::FileFilter> filter_XML = Gtk::FileFilter::create();
	filter_XML->set_name("XML files");
	filter_XML->add_mime_type("text/xml");
	navegador_archivos.add_filter(filter_XML);

	int result = navegador_archivos.run();

	switch (result) {
		case(Gtk::RESPONSE_OK):
		{
			persistencia.setRutaArchivoXML(navegador_archivos.get_filename());
			persistencia.recuperar();
			persistencia.cargar(ventana);
			break;
		}
		default:
		{
			break;
		}
	}
}

void BarraMenu::on_menu_archivo_guardarMundo() {
	VentanaDiseniador *ventana = dynamic_cast<VentanaDiseniador*>(
			get_toplevel());
	Gtk::FileChooserDialog navegador_archivos("Escoge una carpeta para guardar",
			Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
	navegador_archivos.set_transient_for(*ventana);
	navegador_archivos.set_do_overwrite_confirmation(true);
	navegador_archivos.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
	navegador_archivos.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);
	int result = navegador_archivos.run();

	switch (result) {
		case(Gtk::RESPONSE_OK):
		{
			persistencia.setRutaArchivoXML(navegador_archivos.get_filename());
			persistencia.guardar(ventana);
			persistencia.persistir();
			break;
		}
		default:
		{
			break;
		}
	}
}

void BarraMenu::on_menu_archivo_eliminarNivel() {
	VentanaDiseniador *ventana = dynamic_cast<VentanaDiseniador*>(
			get_toplevel());
	PropiedadesMundo *mundo = ventana->getPropiedadesMundoActual();
	mundo->eliminarPropiedadesNivelActual();
	ventana->getVistaNavegador()->quitarNivel();
	ventana->actualizarVistaPropiedadesNivel();
}

void BarraMenu::on_menu_archivo_salir() {
	get_toplevel()->hide();
}

void BarraMenu::on_menu_ayuda_acerca() {
	Gtk::MessageDialog dialogo(*(dynamic_cast<Gtk::Window*>(get_toplevel())),
			"Acerca de...");
	dialogo.set_secondary_text("Cerditos Furiosos - Diseñador de Mundos\n"
			"Version 1.0\n\nCreadores:\n\tLucero, Nahuel\n\tLucero, Martin "
			"Andres\n\tMendez, Pablo\n\tMonzón, Maximiliano");
	dialogo.run();
}